summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/audio/audio_in.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/service/audio/audio_in.cpp')
-rw-r--r--src/core/hle/service/audio/audio_in.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/core/hle/service/audio/audio_in.cpp b/src/core/hle/service/audio/audio_in.cpp
new file mode 100644
index 000000000..d847e0fc8
--- /dev/null
+++ b/src/core/hle/service/audio/audio_in.cpp
@@ -0,0 +1,131 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/audio/audio_in.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/ipc_helpers.h"
+
+namespace Service::Audio {
+using namespace AudioCore::AudioIn;
+
+IAudioIn::IAudioIn(Core::System& system_, Manager& manager, size_t session_id,
+ const std::string& device_name, const AudioInParameter& in_params,
+ Kernel::KProcess* handle, u64 applet_resource_user_id)
+ : ServiceFramework{system_, "IAudioIn"}, process{handle}, service_context{system_, "IAudioIn"},
+ event{service_context.CreateEvent("AudioInEvent")},
+ impl{std::make_shared<In>(system_, manager, event, session_id)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&IAudioIn::GetAudioInState>, "GetAudioInState"},
+ {1, C<&IAudioIn::Start>, "Start"},
+ {2, C<&IAudioIn::Stop>, "Stop"},
+ {3, C<&IAudioIn::AppendAudioInBuffer>, "AppendAudioInBuffer"},
+ {4, C<&IAudioIn::RegisterBufferEvent>, "RegisterBufferEvent"},
+ {5, C<&IAudioIn::GetReleasedAudioInBuffer>, "GetReleasedAudioInBuffer"},
+ {6, C<&IAudioIn::ContainsAudioInBuffer>, "ContainsAudioInBuffer"},
+ {7, C<&IAudioIn::AppendAudioInBuffer>, "AppendUacInBuffer"},
+ {8, C<&IAudioIn::AppendAudioInBuffer>, "AppendAudioInBufferAuto"},
+ {9, C<&IAudioIn::GetReleasedAudioInBuffer>, "GetReleasedAudioInBuffersAuto"},
+ {10, C<&IAudioIn::AppendAudioInBuffer>, "AppendUacInBufferAuto"},
+ {11, C<&IAudioIn::GetAudioInBufferCount>, "GetAudioInBufferCount"},
+ {12, C<&IAudioIn::SetDeviceGain>, "SetDeviceGain"},
+ {13, C<&IAudioIn::GetDeviceGain>, "GetDeviceGain"},
+ {14, C<&IAudioIn::FlushAudioInBuffers>, "FlushAudioInBuffers"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
+ process->Open();
+
+ if (impl->GetSystem()
+ .Initialize(device_name, in_params, handle, applet_resource_user_id)
+ .IsError()) {
+ LOG_ERROR(Service_Audio, "Failed to initialize the AudioIn System!");
+ }
+}
+
+IAudioIn::~IAudioIn() {
+ impl->Free();
+ service_context.CloseEvent(event);
+ process->Close();
+}
+
+Result IAudioIn::GetAudioInState(Out<u32> out_state) {
+ *out_state = static_cast<u32>(impl->GetState());
+ LOG_DEBUG(Service_Audio, "called. state={}", *out_state);
+ R_SUCCEED();
+}
+
+Result IAudioIn::Start() {
+ LOG_DEBUG(Service_Audio, "called");
+ R_RETURN(impl->StartSystem());
+}
+
+Result IAudioIn::Stop() {
+ LOG_DEBUG(Service_Audio, "called");
+ R_RETURN(impl->StopSystem());
+}
+
+Result IAudioIn::AppendAudioInBuffer(InArray<AudioInBuffer, BufferAttr_HipcMapAlias> buffer,
+ u64 buffer_client_ptr) {
+ if (buffer.empty()) {
+ LOG_ERROR(Service_Audio, "Input buffer is too small for an AudioInBuffer!");
+ R_THROW(Audio::ResultInsufficientBuffer);
+ }
+
+ [[maybe_unused]] const auto session_id{impl->GetSystem().GetSessionId()};
+ LOG_TRACE(Service_Audio, "called. Session {} Appending buffer {:08X}", session_id,
+ buffer_client_ptr);
+
+ R_RETURN(impl->AppendBuffer(buffer[0], buffer_client_ptr));
+}
+
+Result IAudioIn::RegisterBufferEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_DEBUG(Service_Audio, "called");
+ *out_event = &impl->GetBufferEvent();
+ R_SUCCEED();
+}
+
+Result IAudioIn::GetReleasedAudioInBuffer(OutArray<u64, BufferAttr_HipcMapAlias> out_audio_buffer,
+ Out<u32> out_count) {
+ *out_count = impl->GetReleasedBuffers(out_audio_buffer);
+
+ LOG_TRACE(Service_Audio, "called. Session {} released {} buffers",
+ impl->GetSystem().GetSessionId(), *out_count);
+ R_SUCCEED();
+}
+
+Result IAudioIn::ContainsAudioInBuffer(Out<bool> out_contains_buffer, u64 buffer_client_ptr) {
+ *out_contains_buffer = impl->ContainsAudioBuffer(buffer_client_ptr);
+
+ LOG_DEBUG(Service_Audio, "called. Is buffer {:08X} registered? {}", buffer_client_ptr,
+ *out_contains_buffer);
+ R_SUCCEED();
+}
+
+Result IAudioIn::GetAudioInBufferCount(Out<u32> out_buffer_count) {
+ *out_buffer_count = impl->GetBufferCount();
+ LOG_DEBUG(Service_Audio, "called. Buffer count={}", *out_buffer_count);
+ R_SUCCEED();
+}
+
+Result IAudioIn::SetDeviceGain(f32 device_gain) {
+ impl->SetVolume(device_gain);
+ LOG_DEBUG(Service_Audio, "called. Gain {}", device_gain);
+ R_SUCCEED();
+}
+
+Result IAudioIn::GetDeviceGain(Out<f32> out_device_gain) {
+ *out_device_gain = impl->GetVolume();
+ LOG_DEBUG(Service_Audio, "called. Gain {}", *out_device_gain);
+ R_SUCCEED();
+}
+
+Result IAudioIn::FlushAudioInBuffers(Out<bool> out_flushed) {
+ *out_flushed = impl->FlushAudioInBuffers();
+ LOG_DEBUG(Service_Audio, "called. Were any buffers flushed? {}", *out_flushed);
+ R_SUCCEED();
+}
+
+} // namespace Service::Audio